﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using mapfre.odeon;
using Emc.InputAccel.CaptureClient;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;


namespace GENERALITAT_LlamarServicioWeb
{
    public class llamar_WS : CustomCodeModule
    {

        public override bool SetupCodeModule(Control parentWindow, IValueAccessor stepConfiguration)
        {
            return true;
        }
        public override void ExecuteTask(IClientTask task, IBatchContext batchContext)
        {

            LogManager.log("=============================================================");
            LogManager.log("Incio Ejecución Módulo LLAMAR_WEBSERVICE");
            LogManager.log("Iniciando ejecución para lote: " + batchContext.BatchName + " con ID: " + batchContext.BatchId + "Fecha/hora: " + DateTime.Now.ToString());
            IBatchNode nodo_custom = batchContext.GetStepNode(task.BatchNode, "CustomValues");

            try
            {
                String pControl = nodo_custom.NodeData.ValueSet.ReadString("WS_contraseña");
                String centro = nodo_custom.NodeData.ValueSet.ReadString("Id_Centro");
                String num_centro = nodo_custom.NodeData.ValueSet.ReadString("Num_centro");
                String id_alumno = nodo_custom.NodeData.ValueSet.ReadString("Id_Alumno");
                String cad_conexion = nodo_custom.NodeData.ValueSet.ReadString("Cadena_conexion_bbdd");

                if (num_centro.Length == 7)
                { 
                   num_centro = "0" + num_centro;
                }
                int num_alumnos_centro = 0;
                int num_procesados = 0;
                //Comprobar procesados
                LogManager.log("Cadena de CONEXIÓN: " + cad_conexion);

                SqlConnection sqlConnection1 = new SqlConnection(cad_conexion+";");
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;

                cmd.CommandText = "SELECT corregido, COUNT(*) FROM respuestas WHERE SUBSTRING(id_alumno,1,8)='" + centro + "' AND corregido='TRUE' AND enviado_ws = 'FALSE' GROUP BY corregido;";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = sqlConnection1;
                

                try
                {
                    sqlConnection1.Open();
                    reader = cmd.ExecuteReader();
                    num_procesados = 0;
                    while (reader.Read())
                    {
                        num_procesados = reader.GetInt32(1);
                    }
                    sqlConnection1.Close();

                }
                catch (Exception ex1)
                {
                    throw new Exception("ERROR EN BASE DE DATOS: " + ex1.Message);
                }
                //Consultar numero alumnos por centro
                cmd.CommandText = "SELECT SUBSTRING(id_alumno,1,8), CONVERT(INT,COUNT(*)) FROM alumnos WHERE SUBSTRING(id_alumno,1,8) ='" + centro + "' AND NOT nombre LIKE '' GROUP BY SUBSTRING(id_alumno,1,8) ;";
                
                cmd.CommandType = CommandType.Text;
                cmd.Connection = sqlConnection1;
                try
                {
                    sqlConnection1.Open();
                    reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        num_alumnos_centro = reader.GetInt32(1);
                    }
                    LogManager.log("numALUMNOS_CENTRO = "+num_alumnos_centro.ToString());
                    sqlConnection1.Close();

                }
                catch (Exception ex1)
                {
                    throw new Exception("ERROR EN BASE DE DATOS: " + ex1.Message);
                }

                //Calcular los que tienen correción Interna 

                //select correccion_interna from alumnos where SUBSTRING(id_alumno,1,8)='66814113' and not correccion_interna ='';

                cmd.CommandText = "SELECT correccion_interna FROM alumnos WHERE SUBSTRING(id_alumno,1,8)='" + centro + "' AND NOT correccion_interna ='';";

                cmd.CommandType = CommandType.Text;
                cmd.Connection = sqlConnection1;

                string examenes_correccion_int = string.Empty;
                try
                {
                    sqlConnection1.Open();
                    reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        examenes_correccion_int = examenes_correccion_int + reader.GetString(0) + ",";
                    }

                    sqlConnection1.Close();
                }
                catch (Exception ex1)
                {
                    throw new Exception("ERROR EN BASE DE DATOS: " + ex1.Message);
                }

                int num_correc_int = examenes_correccion_int.Split(',').Count() - 1;

                LogManager.log("NUM ALUMNOS CON CORRECCION INTERNA: "+num_correc_int);

                num_alumnos_centro = num_alumnos_centro * 4; //Cada alumno hace 4 examenes

                num_alumnos_centro = num_alumnos_centro - num_correc_int; //restamos los alumnos con correción interna

                LogManager.log("numEXAMENES TOTALES = " + num_alumnos_centro.ToString());

                nodo_custom.NodeData.ValueSet.WriteString("Num_alumnos_centro", num_alumnos_centro.ToString());
                nodo_custom.NodeData.ValueSet.WriteString("num_alumnos_procesados", num_procesados.ToString());

                //if (num_alumnos_centro>0) //fake condition para provocar fallo en el webservice
                if (num_alumnos_centro.Equals(num_procesados))
                { //LLamar al servicio web
                    LogManager.log("CENTRO COMPLETADO: SE PROCEDE A LA LLAMADA AL SERVICIO WEB");
                    //1) extraer Datos BBDD
                    cmd.CommandText = "SELECT * FROM respuestas WHERE SUBSTRING(id_alumno,1,8)='" + centro + "' AND corregido='TRUE' AND enviado_ws = 'FALSE';";
                    /*
                     * [0][id_respuesta]
                       [1][id_cuaderno]
                       [2][id_alumno]
                       [3][items]
                       [4][nota]
                       [5][ausente]
                       [6][correcion_interna]
                       [7][nombre_materia]
                       [8][valoracion_prueba]
                       [9][enviado_ws]
                       [10][error_ws]
                       [11][corregido]
                     */
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = sqlConnection1;

                    LogManager.log("Conectado con BBDD....");

                    sqlConnection1.Open();
                    reader = cmd.ExecuteReader();
                    List<String> Alumno = new List<string>();
                    List<String> Ausente = new List<string>();
                    //List<String> Correccion_interna = new List<string>();
                    List<String> Item = new List<string>();
                    List<String> Cuaderno = new List<string>();
                    List<String> notas = new List<string>();

                    String fichero_csv = String.Empty;

                    fichero_csv = "#ID_ALUMNO; #AUSENTE; #ITEM; #CUADERNO; #NOTAS\n";

                    LogManager.log("CONEXCION OK!\nRECOGIENDO DATOS...");
                    while (reader.Read())
                    {
                        Alumno.Add(reader.GetString(2));
                        Ausente.Add(reader.GetString(5));
                        //Correccion_interna(reader.GetString(6));
                        Item.Add(reader.GetString(3));
                        Cuaderno.Add(reader.GetString(1));
                        notas.Add(reader.GetString(4));
                        fichero_csv = fichero_csv  +reader.GetString(2)+"; "+reader.GetString(5)+"; "+reader.GetString(3)+"; "+reader.GetString(1)+"; "+reader.GetString(4)+"\n";
                    }

                    sqlConnection1.Close();
                    LogManager.log("DATOS RECOGIDOS CON ÉXITO\nARMANDO LA LLAMADA...");
                    //Contruir la cadena y llamar al WS

                    String pnotesAlumno = String.Empty;

                    for (int i = 0; i < Alumno.Count(); i++)
                    {
                        String[] item_separados = Item[i].Split(',');
                        String[] notas_separadas = notas[i].Split(',');

                        for (int j = 0; j < item_separados.Length; j++)
                        {

                            int num_espacios = 8 - item_separados[j].Length;
                            string espacios = string.Empty;
                            for (int k = 0; k < num_espacios; k++)
                            {
                                espacios = espacios + " ";
                            }
                            pnotesAlumno = pnotesAlumno + "#" + Alumno[i] + Ausente[i] + "N" + espacios + item_separados[j] + Cuaderno[i] + notas_separadas[j];
                        }
                    }

                   //exportando csv
                    LogManager.log("Exportando CSV para log");

                    string fic = @"C:\generalitat_log\CSVs\" + centro + ".csv";

                    System.IO.StreamWriter sw = new System.IO.StreamWriter(fic);
                    sw.WriteLine(fichero_csv);
                    sw.Close();

                    LogManager.log("LLAMADA ARAMADA CON ÉXITO\nPREPARANDO AL LLAMADA AL WEBSERVICE...");

                    try
                    {
                        /*
                        fnWsNotesClob0Request request = new fnWsNotesClob0Request(num_centro, pControl, pnotesAlumno);

                        fnWsNotesClob0Response response = new fnWsNotesClob0Response();
                        A4s_pdfPortType service = new A4s_pdfPortTypeClient();
                        response = service.fnWsNotesClob(request);

                        string respuesta = response.@return;
                        */

                        string respuesta = String.Empty;
                        GENERALITAT_LlamarServicioWeb.WS_Generalitat_Web.A4s_pdf servicio = new WS_Generalitat_Web.A4s_pdf();
                        respuesta = servicio.fnWsNotesClob(num_centro, pControl, pnotesAlumno);

                        if (respuesta.Equals("Les dades s'han enviat correctament."))
                        {
                            LogManager.log("LLAMADA CORRECTA! Resultado: "+respuesta);
                            nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Llamada_Fallida", "FALSE");
                            nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Mensaje_ErrorWS", respuesta);

                            LogManager.log("Actualizando la base de datos... ");

                            cmd.CommandText = "UPDATE respuestas SET [enviado_ws] = 'TRUE' WHERE substring(id_alumno,1,8) = '"+centro+"';";
                            cmd.CommandType = CommandType.Text;
                            cmd.Connection = sqlConnection1;
                            try
                            {
                                sqlConnection1.Open();
                                reader = cmd.ExecuteReader();
                                LogManager.log("ACTUALIZADOS ALUMNOS DEL CENTRO " + centro);
                                sqlConnection1.Close();

                            }
                            catch (Exception ex1)
                            {
                                throw new Exception("ERROR EN BASE DE DATOS: " + ex1.Message);
                            }

                        }
                        else
                        {
                            LogManager.log("¡¡¡¡¡LLAMADA INCORRECTA!!!!! Resultado: " + respuesta);
                            nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Llamada_Fallida", "TRUE");
                            nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Mensaje_ErrorWS", respuesta);

                            LogManager.log("ACTUALIZANDO REGISTROS reprocesar ");
                            
                            cmd.CommandText = "UPDATE respuestas SET enviado_ws = 'TRUE', error_ws = 'ERROR:REVISAR' WHERE substring(id_alumno,1,8) = '" + centro + "';";

                            string fic2 = @"C:\generalitat_log\llamadasWS_erradas\"+centro+".txt";
                            
                            System.IO.StreamWriter sw2 = new System.IO.StreamWriter(fic2);
                            sw2.WriteLine(pnotesAlumno);
                            sw2.Close();


                            cmd.CommandType = CommandType.Text;
                            cmd.Connection = sqlConnection1;
                            try
                            {
                                sqlConnection1.Open();
                                reader = cmd.ExecuteReader();
                                LogManager.log("Actualizando las respuestas de la Base de datos de los  ALUMNOS DEL CENTRO "+centro) ;
                                sqlConnection1.Close();

                            }
                            catch (Exception ex1)
                            {
                                throw new Exception("ERROR EN BASE DE DATOS: " + ex1.Message);
                            }
                        }
                    }
                    catch (Exception ex2)
                    {
                        throw new Exception("ERROR en LLAMADA a SERVICIO WEB: " + ex2.Message);
                    }
                }
                else
                {
                    int restantes = num_alumnos_centro - num_procesados;
                    LogManager.log("No se ha llamado al web service.Del centro " + centro + " faltan por procesar " + restantes.ToString() + " alumnos de un total de " + num_alumnos_centro.ToString());
                    nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Llamada_Fallida", "NULL");
                }

                task.CompleteTask();
            }
            catch (Exception ex)
            {
                LogManager.log("ERROR EN LLamar SERVICIO WEB");
                LogManager.log(ex.Message);
                LogManager.log(ex.StackTrace);
                nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Mensaje_ErrorWS", ex.Message);
                nodo_custom.Root.NodeData.ValueSet.WriteString("WS_Llamada_Fallida", "TRUE");
                task.FailTask(FailTaskReasonCode.GenericUnrecoverableError, ex);
            }

        }
        public override void StartModule(ICodeModuleStartInfo startInfo)
        {
            LogManager.moduleInfo = startInfo;
        }

    }
}

